package com.allwees.bs.core.model.order.entity;

import com.allwees.bs.core.model.payment.enums.EPaymentType;
import com.allwees.bs.core.modelbase.entity.BaseEntity;
import com.allwees.core.common.constant.EPlatform;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import javax.persistence.Column;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.MappedSuperclass;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import java.math.BigDecimal;
import java.util.Date;

@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@MappedSuperclass
public abstract class OrderModel extends BaseEntity {
    /** 编号 */
    @Column(length = 48, updatable = false)
    protected String no;

    /** 订单生成方式,拼团或者单独购买, 0表示单独买，1表示拼团买，2活动订单 */
    protected Integer type;

    /**
     * 是否是新用户购买
     */
    protected Boolean newUser;

	/**
	 * 创建订单时的来源平台
	 */
    @Enumerated(EnumType.STRING)
	protected EPlatform platform;

    @Column(length = 48, updatable = false)
    private String inviterUserUuid;

    @Column(name = "user_uuid", length = 48, updatable = false)
    protected String userUuid;

    /** 优惠券 */
    @Column(length = 48)
    protected String userCouponUuid;

    @Column(length = 48)
    protected String userPromoLogUuid;

	/** 推广码 **/
    @Column(length = 48)
    private String promoCode;

    /** 支付账号ID **/
    @Column(length = 48)
    protected String paymentUuid;

    /** 商品件数（一个订单里包含的商品数量） */
    protected Integer sum;

    /** 订单总金额 */
    protected BigDecimal amt;

	/** 平台订单金额 */
	protected BigDecimal platformAmt;
	/** 商家订单金额 */
	protected BigDecimal merchantAmt;

    /** 用户现金 **/
    private BigDecimal amtCash;

    /** shipped count **/
    protected Integer shippedCount = 0;

    /** 收件次数 **/
    protected Integer receivedCount = 0;

    /**
     * 已妥投子单数
     */
    protected Integer deliveredCount = 0;

    /** 订单项数（一个订单里包含的子订单数量） **/
    protected Integer quantity;

    /** 商品总价 */
    protected BigDecimal amtProduct;

    /** 运费 */
    protected BigDecimal amtShipping;

    /** 加价后运费总价 */
    protected BigDecimal amtShippingAfterAdd;

    /** 运费优惠金额 */
    protected BigDecimal amtShippingDiscount ;

    /** 商品优惠金额  */
    protected BigDecimal amtProductDiscount ;

    /** 优惠总额 */
    private BigDecimal amtDiscount;

    /** 加价后商品总价 */
    protected BigDecimal amtProductAfterAdd;




    /** 优惠总金额 */
    protected BigDecimal amtProductCoupon;

    /** 原始运费金额 */
    protected BigDecimal originalAmtShipping;

    /** 原始商品金额 */
    protected BigDecimal originalAmtProduct;

    /** 实际金额 */
    protected BigDecimal originalAmt;

    /** 营业税 */
    protected BigDecimal amtSaleTax;

    /** 营业税(原始总税费) */
    protected BigDecimal originalAmtSaleTax;

    /** 加价后营业税 */
    protected BigDecimal amtSaleTaxAfterAdd;


    /** 运费险 */
    protected BigDecimal amtShippingInsurance;

    /** 订单总金额币种 */
    @Column(length = 4)
    protected String currency;

    /** 支付方式，默认paypal **/
    @Enumerated(EnumType.STRING)
    protected EPaymentType paymentType;

    /** 进入待发货日期 */
    @Temporal(TemporalType.DATE)
    protected Date shippingWaitAt;

    /** 支付过期时间 */
    protected Date paymentExpiredAt;

    /** 支付时间 **/
    protected Date paymentAt;

    /** 订单关闭时间 **/
    protected Date closedAt;

    /** 收货日期 **/
    protected Date receiveAt;

    /** 订单履约周期 **/
    protected Float  orderPerformanceHours;

    /** 是否已支付 **/
    protected Boolean payed;

    /** 是否同步 (0 为未同步) **/
    protected Boolean synced;

    /** 退货次数 **/
    protected Integer refundCount = 0;

    /** 订单主图 **/
    protected String mainPhoto;

    // 快递方式
    @Column(length = 48)
    protected String shippingAddressUuid;

    /**
     * 下单渠道号
     *
     * NOTE: 不同的小马甲可能会存在下单和支付不一样的情况，但是由于目前是放在一起的，
     *   为了便于扩展，在代码层次上还是将两个事件分开处理。
     */
    @Column(name = "order_channel_uuid", length = 48, updatable = false)
    protected String orderChannelUuid;

    /**
     * 支付渠道号
     *
     * NOTE: 不同的小马甲可能会存在下单和支付不一样的情况，但是由于目前是放在一起的，
     *   为了便于扩展，在代码层次上还是将两个事件分开处理。
     */
    @Column(name = "pay_channel_uuid", length = 48, updatable = false)
    protected String payChannelUuid;

    /**
     * 退款渠道号
     *
     * NOTE: 不同的小马甲可能会存在下单和支付不一样的情况，但是由于目前是放在一起的，
     *   为了便于扩展，在代码层次上还是将两个事件分开处理。
     */
    @Column(name = "refund_channel_uuid", length = 48, updatable = false)
    protected String refundChannelUuid;

    protected String shippingAddressFirstName;

    protected String shippingAddressLastName;

    protected String shippingAddressItu;

    protected String shippingAddressPhone;

    protected String shippingAddressCountry;

    protected String shippingAddressProvince;

    protected String shippingAddressCity;

    protected String shippingAddressZipCode;

    @Column(name = "shipping_address_line1")
    protected String shippingAddressLine1;

    @Column(name = "shipping_address_line2")
    protected String shippingAddressLine2;

    /**
     * 添加备注
     */
    protected String note;

    public String getPaymentTypeDesc(){
        if (null == this.paymentType) {
            return "";
        }
        return  paymentType.getValue().equals(EPaymentType.PAYPAL.getValue()) ? "Paypal": paymentType.getValue().equals(EPaymentType.COUPON.getValue()) ? "Coupon": "";
    }
}
